跳到主要内容

03Singleton

单例模式(Singleton)

确保某一个类只有一个实例, 而且自行实例化并向整个系统提供这个实例。

意图: 希望只拥有一个对象, 但不用全局对象来控制对象的实例化。

问题: 几个不同的客户对象需要引用同样的对象, 你希望确保自己拥有的这 种对象不超过一个。

一个全局使用的类频繁地创建与销毁。当您想控制实例数目,节省系统资源的时候。

实现:

  • ①在 Singleton 中添加静态成员, 初始化为 NULL
  • ②添加静态成员方法, 若静态成员变量为 NULL,则实始化并返回。
  • ③将构造成员, 设为 private 或是 protected, 这样只能通过静态方法实例化。

构造函数是私有的。

应用实例:

  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
  • 1、要求生产唯一序列号。
  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

传统的方式,已经被private,不可用。

static方式 在类内部 保证了唯一性。

#include <iostream>

using namespace std;

//传统的方式,被private后, 传统的方式不可用。(A a ; new A)

//static func 唯一性


class Singleton
{
public:
static Singleton * getInstance()
{
if(_ins == nullptr)
_ins = new Singleton;
return _ins;
}
private:
static Singleton *_ins;
Singleton(){}
Singleton(const Singleton &){}
Singleton & operator =(const Singleton &){}
~Singleton(){}

};

Singleton *Singleton::_ins=nullptr;

int main()
{
Singleton *ps = Singleton::getInstance();

Singleton *ps2 = Singleton::getInstance();

if(ps==ps2)
cout<<"\n ps == ps2 "<<endl;

// Singleton s3(*ps);

return 0;
}